这个是我博客的中的一篇文章

One assertion per test 的意思是:一个 test case 只测试一件事情。

下面这个方法的作用是注册用户。

def create
  user = User.new(params[:user])
  if user.save
    flash[:success] = "Thanks for registering Myblog, please sign in."
    redirect_to sign_in_path
  else
    flash[:error] = "Please check your input."
    render :new
  end
end

对于上面这个方法,使用 one assertion per test 的原则你就必须写如下这些测试,下面在两种情况下进行了测试:

describe "POST create" do
  context "with valid input" do
    before do
      post :create, user: { email: "eric@gmail.com", password: "123", name: "Eric Wu" }
    end

    it "creates a user" do
      expect(User.count).to eq(1)
    end

    it "redirects to the sign in page" do
      expect(response).to redirect_to sign_in_path
    end

    it "show the sucess message" do
      expect(flash[:success]).to eq("Thanks for registering Myblog, please sign in.")
    end
  end

  context "with invalid input" do
    before do
      post :create, user: { email: "eric@example.com" }
    end

    it "does not create a user" do
      expect(User.count).to eq(0)
    end

    it "redirects to the :new template" do
      expect(response).to render :new
    end

    it "show the error message" do
      expect(flash[:error]).to eq("Please check your input.")
    end
  end
end

遵循 one assertion per test 的原则能让你更清楚的写出unit test, 如果一个method你做了太多的事情,那么你就知道自己的设计是有问题的,就需要重构代码了。


ericwu
196 声望4 粉丝

下一篇 »
VIM Tutorial

引用和评论

0 条评论